In traditional networking, data is transferred from a memory page allocated to an application to a socket buffer for transmission by a network interface controller (NIC) to a remote device. The socket buffer is typically maintained in memory to which the NIC can get direct memory access (DMA). The act of copying the data from the memory page allocated to the application to the socket buffer directly accessible to the NIC introduces transport overhead.
To mitigate the transport overhead introduced by copying the data from the memory page allocated to the application to the socket buffer, some protocols use a zero copy technique. In the zero copy technique, the NIC is granted direct memory access to the memory page that is in use by the application. Until the NIC completes transmission of the data from the memory page, the application can neither release the memory page nor modify the physical memory location. In some instances, there may be a significant delay between when the NIC is granted DMA to the memory page and when the NIC transmits the data at the memory page. Accordingly, the use of zero copy techniques for transmitting data can be problematic.